//=============================================================================
// Drill_EventFadeInEffect.js
//=============================================================================

/*:
 * @plugindesc [v1.4]        行走圖 - 顯現動作效果
 * @author Drill_up，老饕魔改（修改標準升起效果，緩衝時間為0時去除緩衝效果）
 * 
 * 
 * @help  
 * =============================================================================
 * +++ Drill_EventFadeInEffect +++
 * 作者：Drill_up
 * 如果你有興趣，也可以來看看我的mog中文全翻譯插件哦ヽ(*。>Д<)o゜
 * https://rpg.blue/thread-409713-1-1.html
 * =============================================================================
 * 使得你可以播放事件顯現出來的各種動作。
 * 
 * -----------------------------------------------------------------------------
 * ----設定注意事項
 * 1.插件的作用域：地圖界面。
 *   作用於 事件、玩家 。
 * 2.建議先了解基本定義"顯示與透明度.docx"。
 *   更多詳細內容，去看看"關於動作效果.docx"。
 * 細節：
 *   (1.所有動作都是並行的，你可能需要手動加等待時間。
 *   (2.所有 顯現動作 都可以與持續動作效果疊加，但不包括透明度的疊加。
 *      顯現動作 同時只能播放一種。
 * 指令：
 *   (1.顯現動作固定為：從 完全透明 到 完全不透明 的過程。
 *      動作結束後，對象的透明度將變為255。
 *   (2.不同類型動作的參數和指令有較大區別。
 *      如果指令的參數名和參數數量不匹配，則動作不會被執行。
 * 透明度：
 *   (1.開啟"透明度檢查"後，如果事件的透明度為255，則動作會被阻止播放。
 *   (2.該插件隻影響事件的 透明度 ，並不控制 透明狀態 。
 *      若rmmv的透明狀態為ON時，事件直接不可見，動作也不可見。
 * 設計：
 *   (1.你可以使得事件消失之後，顯現出現在鏡像中。或者反過來。
 *      具體可以去鏡像管理層看看"鏡像化"的小愛麗絲。
 *   (2.該效果可以與 濾鏡效果、方塊粉碎效果 疊加。
 *
 * -----------------------------------------------------------------------------
 * ----激活條件
 * 你需要通過下面插件指令來執行顯現動作：
 * 
 * 插件指令：>顯現動作 : 玩家 : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 玩家領隊 : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 玩家全員 : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 玩家隊員[1] : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 玩家隊員變量[21] : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 本事件 : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 事件[1] : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 事件變量[1] : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 批量事件[10,11] : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 批量事件變量[21,22] : 標準彈跳 : 時間[60] : 高度[168]
 * 
 * 插件指令：>顯現動作 : 本事件 : 標準落下 : 時間[60] : 緩衝時間[20] : 高度[168]
 * 插件指令：>顯現動作 : 本事件 : 標準彈跳 : 時間[60] : 高度[168]
 * 插件指令：>顯現動作 : 本事件 : 放大出現 : 時間[60] : 緩衝時間[20]
 * 插件指令：>顯現動作 : 本事件 : 橫向冒出 : 時間[60] : 橫向比例[1.5]
 * 插件指令：>顯現動作 : 本事件 : 縱向冒出 : 時間[60] : 縱向比例[1.5]
 * 插件指令：>顯現動作 : 本事件 : 立即終止動作
 * 
 * 1.前半部分（玩家）和 後半部分（標準落下 : 時間[60] : 緩衝時間[20] : 高度[168]）
 *   的參數可以隨意組合。一共有10*6種組合方式。
 * 2."玩家"和"玩家領隊"是同一個意思。
 *   "玩家隊員[1]"表示領隊後面第一個跟隨的隊友。
 * 3.部分類型的動作有 時間和緩衝時間 兩個設定，該動作分兩個階段。
 *   比如"標準落下"，分別對應落下的動作時間，和落地後階段彈簧效果的緩衝時間。
 * 4.如果你不想要任何動作，只想讓事件直接靜態顯現，直接設定 標準彈跳 + 高度0 即可。
 *   但是時間不能為0。
 * 
 * 以下是舊版本的指令，也可以用：
 * 插件指令(舊)：>玩家顯現效果 : 領隊 : 標準落下 : 60 : 168
 * 插件指令(舊)：>玩家顯現效果 : 指定隊員 : 1 : 標準落下 : 60 : 168
 * 插件指令(舊)：>玩家顯現效果 : 指定隊員(變量) : 1 : 標準落下 : 60 : 168
 * 插件指令(舊)：>玩家顯現效果 : 全部隊員 : 標準落下 : 60 : 168
 * 插件指令(舊)：>事件顯現效果 : 本事件 : 標準落下 : 60 : 168
 * 插件指令(舊)：>事件顯現效果 : 指定事件 : 1 : 標準落下 : 60 : 168
 * 插件指令(舊)：>事件顯現效果 : 指定事件(變量) : 1 : 標準落下 : 60 : 168
 * 
 * -----------------------------------------------------------------------------
 * ----可選設定 - 透明度檢查
 * 如果有的事件已經是透明度為255了，你不想讓他再播放一次出現動畫，你可以使用
 * 下面的插件指令。
 * 
 * 插件指令：>顯現動作 : 玩家 : 透明度檢查 : 開啟
 * 插件指令：>顯現動作 : 玩家 : 透明度檢查 : 關閉
 * 插件指令：>顯現動作 : 事件 : 透明度檢查 : 開啟
 * 插件指令：>顯現動作 : 事件 : 透明度檢查 : 關閉
 * 
 * 1.插件指令直接作用於所有玩家，或者所有事件。
 * 2.開啟檢查後，如果當前事件的透明度為255，則動作會被阻止播放。
 * 
 * -----------------------------------------------------------------------------
 * ----插件性能
 * 測試儀器：   4G 內存，Intel Core i5-2520M CPU 2.5GHz 處理器
 *              Intel(R) HD Graphics 3000 集顯 的垃圾筆記本
 *              (筆記本的3dmark綜合分：571，魯大師綜合分：48456)
 * 總時段：     20000.00ms左右
 * 對照表：     0.00ms  - 40.00ms （幾乎無消耗）
 *              40.00ms - 80.00ms （低消耗）
 *              80.00ms - 120.00ms（中消耗）
 *              120.00ms以上      （高消耗）
 * 工作類型：   持續執行
 * 時間複雜度： o(n)*o(鏡像)*o(貼圖處理) 每幀
 * 測試方法：   放置10個動作變化的事件，在事件數量不同的地圖中測。
 * 測試結果：   200個事件的地圖中，平均消耗為：【85.19ms】
 *              100個事件的地圖中，平均消耗為：【46.21ms】
 *               50個事件的地圖中，平均消耗為：【38.16ms】
 *
 * 1.插件只在自己作用域下工作消耗性能，在其它作用域下是不工作的。
 *   測試結果並不是精確值，範圍在給定值的10ms範圍內波動。
 *   更多瞭解插件性能，可以去看看"關於插件性能.docx"。
 * 2.插件對鏡像也有效果，該測試是包括鏡像一起測試的結果。
 *   由於持續變化的事件數量和消耗幾乎成正比，所以放20個以上電腦就帶不動了。
 *
 * -----------------------------------------------------------------------------
 * ----更新日誌
 * [v1.0]
 * 完成插件ヽ(*。>Д<)o゜
 * [v1.1]
 * 修改了插件分類。
 * [v1.2]
 * 優化了內部結構，並且添加了性能測試說明。
 * [v1.3]
 * 修改了插件指令格式。
 * [v1.4]
 * 添加了橫向冒出和縱向冒出。
 * 
 * 
 * 
 * @param 玩家默認透明度檢查
 * @type boolean
 * @on 開啟
 * @off 關閉
 * @desc true - 開啟，false - 關閉。開啟後，會在玩家貼圖透明度處於255時（已經顯現時），阻止玩家的顯現動作。
 * @default false
 * 
 * @param 事件默認透明度檢查
 * @type boolean
 * @on 開啟
 * @off 關閉
 * @desc true - 開啟，false - 關閉。開啟後，會在事件貼圖透明度處於255時（已經顯現時），阻止事件的顯現動作。
 * @default false
 * 
 */
 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//		插件簡稱		EFIE（Event_Fade_In_Effect）
//		臨時全局變量	DrillUp.g_EFIE_xxx
//		臨時局部變量	this._drill_EFIE_xxx
//		存儲數據變量	$gameSystem._drill_EFIE_xxx
//		全局存儲變量	無
//		覆蓋重寫方法	無
//
//		工作類型		持續執行
//		時間複雜度		o(n)*o(鏡像)*o(貼圖處理) 每幀
//		性能測試因素	地圖管理層 125事件
//		性能測試消耗	39.91ms（Sprite_Character.update）
//		最壞情況		所有事件都在執行動作。
//		備註			從原理上看，變化並沒有那麼複雜，只是圖像一直在變。
//						類似於濾鏡，但沒有濾鏡消耗複雜。
//
//插件記錄：
//		★大體框架與功能如下：
//			顯現動作效果：
//				->動作
//					->標準落下
//					->標準彈跳
//					->放大出現
//					->橫向冒出
//					->縱向冒出
//					->翻轉出現	x
//					->地面升起	x
//				->其他
//					->數學錨點變換問題
//					->結構優化（換成Game_Character）
//
//		★必要注意事項：
//			1.變化原理為：每幀都【固定初始值】，然後適時賦值公式變化值。
//			  該插件限定透明度 0->255 的變化。
//			2.由於rmmv函數中沒有【Game_Character.prototype.update】，所以繼承時要用【Game_CharacterBase.prototype.update】。
//			  之前繼承了這個沒有的函數，造成了舉起物體插件出問題。
//
//		★其它說明細節：
//			1.事件的錨點固定為(0.5,1)。
//			2.需要改變x,y,opacity,rotation,scale_x,scale_y的值，並且毫無損失地復原。
//			  另外，對齊每一個插件指令，也是比較頭疼的問題。
//			  結構並不複雜，只是內容劃分太多。	
//			3.隊伍透明度統一存在麻煩的地方，隊長的透明度每幀都會分配給跟隨者。
//			  目前只設置了播放動作的時候，透明度才不統一。
//			4.繼承Game_Character不要用initMembers，因為follower不會調用這個方法。
//
//		★存在的問題：
//			暫無
//		
 
//=============================================================================
// ** 變量獲取
//=============================================================================
	var Imported = Imported || {};
	Imported.Drill_EventFadeInEffect = true;
	var DrillUp = DrillUp || {}; 
	DrillUp.parameters = PluginManager.parameters('Drill_EventFadeInEffect');
	
	DrillUp.g_EFIE_p_opacityCheck = String(DrillUp.parameters['玩家默認透明度檢查'] || "false") === "true";
	DrillUp.g_EFIE_e_opacityCheck = String(DrillUp.parameters['事件默認透明度檢查'] || "false") === "true";
	
	
//=============================================================================
// ** 插件指令
//=============================================================================
var _Drill_EFIE_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
	_Drill_EFIE_pluginCommand.call(this, command, args);
	
	if( command === ">顯現動作" ){
		
		/*-----------------透明度檢查------------------*/
		if( args.length == 6 ){
			var unit = String(args[1]);
			var temp1 = String(args[3]);
			var temp2 = String(args[5]);
			if( unit == "玩家" && temp1 == "透明度檢查" ){
				if( temp2 == "開啟" ){
					$gameSystem._drill_EFIE_opacityCheck_player = true;
				}
				if( temp2 == "關閉" ){
					$gameSystem._drill_EFIE_opacityCheck_player = false;
				}
			}
			if( unit == "事件" && temp1 == "透明度檢查" ){
				if( temp2 == "開啟" ){
					$gameSystem._drill_EFIE_opacityCheck_event = true;
				}
				if( temp2 == "關閉" ){
					$gameSystem._drill_EFIE_opacityCheck_event = false;
				}
			}
		}
		
		/*-----------------對象組獲取------------------*/
		var e_chars = null;			// 事件對象組
		var p_chars = null;			// 玩家對象組
		if( args.length >= 2 ){
			var unit = String(args[1]);
			if( e_chars == null && unit == "本事件" ){
				var e = $gameMap.event( this._eventId );
				e_chars = [ e ];
			}
			if( e_chars == null && unit.indexOf("批量事件[") != -1 ){
				unit = unit.replace("批量事件[","");
				unit = unit.replace("]","");
				e_chars = [];
				var temp_arr = unit.split(/[,，]/);
				for( var k=0; k < temp_arr.length; k++ ){
					var e = $gameMap.event( Number(temp_arr[k]) );
					e_chars.push( e );
				}
			}
			if( e_chars == null && unit.indexOf("批量事件變量[") != -1 ){
				unit = unit.replace("批量事件變量[","");
				unit = unit.replace("]","");
				e_chars = [];
				var temp_arr = unit.split(/[,，]/);
				for( var k=0; k < temp_arr.length; k++ ){
					var e = $gameMap.event( $gameVariables.value(Number(temp_arr[k])) );
					e_chars.push( e );
				}
			}
			if( e_chars == null && unit.indexOf("事件變量[") != -1 ){
				unit = unit.replace("事件變量[","");
				unit = unit.replace("]","");
				var e = $gameMap.event( $gameVariables.value(Number(unit)) );
				e_chars = [ e ];
			}
			if( e_chars == null && unit.indexOf("事件[") != -1 ){
				unit = unit.replace("事件[","");
				unit = unit.replace("]","");
				var e = $gameMap.event( Number(unit) );
				e_chars = [ e ];
			}
			
			if( p_chars == null && ( unit == "玩家" || unit == "玩家領隊" ) ){
				p_chars = [ $gamePlayer ];
			}
			if( p_chars == null && unit == "玩家全員" ){
				p_chars = $gamePlayer.followers().visibleFollowers();
				p_chars.unshift($gamePlayer);
			}
			if( p_chars == null && unit.indexOf("玩家隊員變量[") != -1 ){
				unit = unit.replace("玩家隊員變量[","");
				unit = unit.replace("]","");
				var group = $gamePlayer.followers().visibleFollowers();
				group.unshift($gamePlayer);
				p_chars = [];
				p_chars.push(group[ $gameVariables.value(Number(unit)) ]);
			}
			if( p_chars == null && unit.indexOf("玩家隊員[") != -1 ){
				unit = unit.replace("玩家隊員[","");
				unit = unit.replace("]","");
				var group = $gamePlayer.followers().visibleFollowers();
				group.unshift($gamePlayer);
				p_chars = [];
				p_chars.push(group[ Number(unit) ]);
			}
		}
		// > 透明度檢查
		if( p_chars != null && $gameSystem._drill_EFIE_opacityCheck_player && $gamePlayer.opacity() == 255 ){
			p_chars = null;
		}
		if( e_chars != null && $gameSystem._drill_EFIE_opacityCheck_event ){
			var temp_tank = [];
			for( var k=0; k < e_chars.length; k++ ){
				if( e_chars[k].opacity() != 255 ){
					temp_tank.push( e_chars[k] );
				}
			}
			e_chars = temp_tank;
		}
		
		/*-----------------立即終止動作------------------*/
		if( args.length == 4 ){
			var type = String(args[3]);
			if( type == "立即終止動作" ){
				if( e_chars != null){
					for( var k=0; k < e_chars.length; k++ ){
						e_chars[k].drill_EFIE_stopEffect();
					}
				}
				if( p_chars != null){
					for( var k=0; k < p_chars.length; k++ ){
						p_chars[k].drill_EFIE_stopEffect();
					}
				}
			}
		}	
			
		if( args.length == 10 ){
			var type = String(args[3]);
			var temp1 = String(args[5]);
			var temp2 = String(args[7]);
			var temp3 = String(args[9]);
			
			/*-----------------標準落下------------------*/
			if( type == "標準落下" ){
				temp1 = temp1.replace("時間[","");
				temp1 = temp1.replace("]","");
				temp2 = temp2.replace("緩衝時間[","");
				temp2 = temp2.replace("]","");
				temp3 = temp3.replace("高度[","");
				temp3 = temp3.replace("]","");
				if( e_chars != null){
					for( var k=0; k < e_chars.length; k++ ){
						e_chars[k].drill_EFIE_playShowingFall( Number(temp1),Number(temp3),Number(temp2) );
					}
				}
				if( p_chars != null){
					for( var k=0; k < p_chars.length; k++ ){
						p_chars[k].drill_EFIE_playShowingFall( Number(temp1),Number(temp3),Number(temp2) );
					}
				}
			}
			
		}
		if( args.length == 8 ){
			var type = String(args[3]);
			var temp1 = String(args[5]);
			var temp2 = String(args[7]);
			/*-----------------標準彈跳------------------*/
			if( type == "標準彈跳" ){
				temp1 = temp1.replace("時間[","");
				temp1 = temp1.replace("]","");
				temp2 = temp2.replace("高度[","");
				temp2 = temp2.replace("]","");
				if( e_chars != null ){
					for( var k=0; k < e_chars.length; k++ ){
						e_chars[k].drill_EFIE_playShowingJump( Number(temp1),Number(temp2) );
					}
				}
				if( p_chars != null ){
					for( var k=0; k < p_chars.length; k++ ){
						p_chars[k].drill_EFIE_playShowingJump( Number(temp1),Number(temp2) );
					}
				}
			}
			/*-----------------放大出現------------------*/
			if( type == "放大出現" ){
				temp1 = temp1.replace("時間[","");
				temp1 = temp1.replace("]","");
				temp2 = temp2.replace("緩衝時間[","");
				temp2 = temp2.replace("]","");
				if( e_chars != null ){
					for( var k=0; k < e_chars.length; k++ ){
						e_chars[k].drill_EFIE_playShowingEnlarge( Number(temp1),Number(temp2) );
					}
				}
				if( p_chars != null ){
					for( var k=0; k < p_chars.length; k++ ){
						p_chars[k].drill_EFIE_playShowingEnlarge( Number(temp1),Number(temp2) );
					}
				}
			}
			/*-----------------橫向冒出------------------*/
			if( type == "橫向冒出" ){
				temp1 = temp1.replace("時間[","");
				temp1 = temp1.replace("]","");
				temp2 = temp2.replace("橫向比例[","");
				temp2 = temp2.replace("]","");
				if( e_chars != null ){
					for( var k=0; k < e_chars.length; k++ ){
						e_chars[k].drill_EFIE_playShowingHorizonFlat( Number(temp1),Number(temp2) );
					}
				}
				if( p_chars != null ){
					for( var k=0; k < p_chars.length; k++ ){
						p_chars[k].drill_EFIE_playShowingHorizonFlat( Number(temp1),Number(temp2) );
					}
				}
			}
			/*-----------------縱向冒出------------------*/
			if( type == "縱向冒出" ){
				temp1 = temp1.replace("時間[","");
				temp1 = temp1.replace("]","");
				temp2 = temp2.replace("縱向比例[","");
				temp2 = temp2.replace("]","");
				if( e_chars != null ){
					for( var k=0; k < e_chars.length; k++ ){
						e_chars[k].drill_EFIE_playShowingVerticalFlat( Number(temp1),Number(temp2) );
					}
				}
				if( p_chars != null ){
					for( var k=0; k < p_chars.length; k++ ){
						p_chars[k].drill_EFIE_playShowingVerticalFlat( Number(temp1),Number(temp2) );
					}
				}
			}
			
		}
	}
	
	
	
	/*-----------------------------------------*/
	/*-----------------舊指令------------------*/
	/*-----------------------------------------*/
	if (command === '>玩家顯現效果') { // >玩家顯現效果 : 領隊 : 標準落下 : 60 : 168
		if(args.length == 6 || args.length == 8){
			var temp1 = String(args[1]);
			var type = String(args[3]);
			var time = Number(args[5]);
			if(args[7]){ var height = Number(args[7]); }
			if( $gamePlayer.opacity() == 255 && $gameSystem._drill_EFIE_opacityCheck_player){
				return;
			}
			if( temp1 == '領隊' ){ 
				if( type == '標準落下' ){
					$gamePlayer.drill_EFIE_playShowingFall(time,height);
				}
				if( type == '標準彈跳' ){
					$gamePlayer.drill_EFIE_playShowingJump(time,height);
				}
				if( type == '放大出現' ){
					$gamePlayer.drill_EFIE_playShowingEnlarge(time);
				}
			}
			if( temp1 == '全部隊員' ){ 
				if( type == '標準落下' ){
					$gamePlayer.drill_EFIE_playShowingFall(time,height);
					$gamePlayer.followers().forEach(function(f){ f.drill_EFIE_playShowingFall(time,height); },this);
				}
				if( type == '標準彈跳' ){
					$gamePlayer.drill_EFIE_playShowingJump(time,height);
					$gamePlayer.followers().forEach(function(f){ f.drill_EFIE_playShowingJump(time,height); },this);
				}
				if( type == '放大出現' ){
					$gamePlayer.drill_EFIE_playShowingEnlarge(time);
					$gamePlayer.followers().forEach(function(f){ f.drill_EFIE_playShowingEnlarge(time); },this);
				}
			}
		}
		if(args.length == 8 || args.length == 10){
			var temp1 = String(args[1]);
			var temp2 = Number(args[3]);
			var type = String(args[5]);
			var time = Number(args[7]);
			if(args[9]){ var height = Number(args[9]); }
			var _followers = $gamePlayer.followers().visibleFollowers();
			_followers.unshift($gamePlayer);
			if( temp1 == '指定隊員' ){
				if( temp2 < _followers.length ){
					if( _followers[temp2].opacity() == 255 && $gameSystem._drill_EFIE_opacityCheck_player){
						return;
					}
					if( type == '標準落下' ){
						_followers[temp2].drill_EFIE_playShowingFall(time,height);
					}
					if( type == '標準彈跳' ){
						_followers[temp2].drill_EFIE_playShowingJump(time,height);
					}
					if( type == '放大出現' ){
						_followers[temp2].drill_EFIE_playShowingEnlarge(time);
					}
				}
			}
			if( temp1 == '指定隊員(變量)' ){ 
				temp2 = $gameVariables.value(temp2);
				if( temp2 < _followers.length ){
					if( _followers[temp2].opacity() == 255 && $gameSystem._drill_EFIE_opacityCheck_player){
						return;
					}
					if( type == '標準落下' ){
						_followers[temp2].drill_EFIE_playShowingFall(time,height);
					}
					if( type == '標準彈跳' ){
						_followers[temp2].drill_EFIE_playShowingJump(time,height);
					}
					if( type == '放大出現' ){
						_followers[temp2].drill_EFIE_playShowingEnlarge(time);
					}
				}
			}
		}
		if(args.length == 2){
			var type = String(args[1]);
			if( type == '透明度檢查開啟' ){
				$gameSystem._drill_EFIE_opacityCheck_player = true;
			}
			if( type == '透明度檢查關閉' ){
				$gameSystem._drill_EFIE_opacityCheck_player = false;
			}
		}
	}
	if (command === '>事件顯現效果') { // >事件顯現效果 : 本事件 : 標準落下 : 60 : 168
		if(args.length == 6 || args.length == 8){
			var temp1 = String(args[1]);
			var type = String(args[3]);
			var time = Number(args[5]);
			if(args[7]){ var height = Number(args[7]); }
			if( temp1 == '本事件' ){
				var e = $gameMap.event( this._eventId );
				if( e.opacity() == 255 && $gameSystem._drill_EFIE_opacityCheck_event){
					return;
				}
				if( type == '標準落下'){
					e.drill_EFIE_playShowingFall(time,height);
				}
				if( type == '標準彈跳'  ){
					e.drill_EFIE_playShowingJump(time,height)
				}
				if( type == '放大出現' ){
					e.drill_EFIE_playShowingEnlarge(time)
				}
			}
		}
		if(args.length == 8 || args.length == 10){
			var temp1 = String(args[1]);
			var temp2 = Number(args[3]);
			var type = String(args[5]);
			var time = Number(args[7]);
			if(args[9]){ var height = Number(args[9]); }
			if( temp1 == '指定事件' ){ 
				var e = $gameMap.event( temp2 );
				if( e.opacity() == 255 && $gameSystem._drill_EFIE_opacityCheck_event){
					return;
				}
				if( type == '標準落下' ){
					e.drill_EFIE_playShowingFall(time,height);
				}
				if( type == '標準彈跳' ){
					e.drill_EFIE_playShowingJump(time,height);
				}
				if( type == '放大出現' ){
					e.drill_EFIE_playShowingEnlarge(time);
				}
			}
			if( temp1 == '指定事件(變量)' ){ 
				var e = $gameMap.event( $gameVariables.value(temp2) );
				if( e.opacity() == 255 && $gameSystem._drill_EFIE_opacityCheck_event){
					return;
				}
				if( type == '標準落下' ){
					e.drill_EFIE_playShowingFall(time,height);
				}
				if( type == '標準彈跳' ){
					e.drill_EFIE_playShowingJump(time,height);
				}
				if( type == '放大出現' ){
					e.drill_EFIE_playShowingEnlarge(time);
				}
			}
		}
		if(args.length == 2){
			var type = String(args[1]);
			if( type == '透明度檢查開啟' ){
				$gameSystem._drill_EFIE_opacityCheck_event = true;
			}
			if( type == '透明度檢查關閉' ){
				$gameSystem._drill_EFIE_opacityCheck_event = false;
			}
		}
	}
};

//=============================================================================
// ** 存儲變量初始化
//=============================================================================
var _drill_EFIE_sys_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
    _drill_EFIE_sys_initialize.call(this);
	this._drill_EFIE_opacityCheck_player = DrillUp.g_EFIE_p_opacityCheck;
	this._drill_EFIE_opacityCheck_event = DrillUp.g_EFIE_e_opacityCheck;
}

//=============================================================================
// ** 跟隨者
//=============================================================================
//==============================
// * 跟隨者 - 透明度同步
//==============================
var _drill_EFIE_setOpacity = Game_Follower.prototype.setOpacity;
Game_Follower.prototype.setOpacity = function(opacity) {
	if( $gamePlayer.drill_EFIE_isPlaying() ){ return; }
	if( this.drill_EFIE_isPlaying() ){ return; }
	_drill_EFIE_setOpacity.call(this,opacity);
};

//=============================================================================
// ** 事件貼圖
//=============================================================================
//==============================
// * 事件貼圖 - 初始化
//==============================
var _Drill_EFIE_s_setCharacter = Sprite_Character.prototype.setCharacter;
Sprite_Character.prototype.setCharacter = function(character) {
	_Drill_EFIE_s_setCharacter.call(this,character);
	if (character) { this._Drill_EFIE = character._Drill_EFIE; };
};

//==============================
// * 事件貼圖 - 固定幀初始值
//==============================
var _Drill_EFIE_s_updatePosition = Sprite_Character.prototype.updatePosition;
Sprite_Character.prototype.updatePosition = function() {
	_Drill_EFIE_s_updatePosition.call(this);			// x、y、z
	if( this.rotation != 0 ){ this.rotation = 0; }		// 旋轉
	if( this.scale.x != 1 ){ this.scale.x = 1; }		// 縮放x
	if( this.scale.y != 1 ){ this.scale.y = 1; }		// 縮放y
	if( this.skew.x != 0 ){ this.skew.x = 0; }			// 斜切x
	if( this.skew.y != 0 ){ this.skew.y = 0; }			// 斜切y
};

//==============================
// * 事件貼圖 - 幀刷新
//==============================
var _Drill_EFIE_s_update = Sprite_Character.prototype.update;
Sprite_Character.prototype.update = function() {
	_Drill_EFIE_s_update.call(this);
	if ( this._character && this._Drill_EFIE ) {
		this.update_EFIE_effect();			//執行變換
		this.update_EFIE_bitmap();			//獲取圖片寬高
	}
};
//==============================
// * 幀刷新 - 執行變換
//==============================
Sprite_Character.prototype.update_EFIE_effect = function() {
	if( !this._character.drill_EFIE_isPlaying() ){ return; }
		
	this.x += this._Drill_EFIE.x ;					// x
	this.y += this._Drill_EFIE.y ;					// y
	this.rotation += this._Drill_EFIE.rotation;		// 旋轉
	this.scale.x += this._Drill_EFIE.scale_x;		// 縮放x
	this.scale.y += this._Drill_EFIE.scale_y;		// 縮放y
	//this.skew.x += this._Drill_EFIE.skew_x;		// 斜切x
	//this.skew.y += this._Drill_EFIE.skew_y;		// 斜切y
	
	this.opacity = this._Drill_EFIE.opacity;		// 透明度
}
//==============================
// * 幀刷新 - 獲取圖片寬高
//==============================
Sprite_Character.prototype.update_EFIE_bitmap = function() {
	if( this.bitmap && this.bitmap.isReady() ){
		this._Drill_EFIE.real_width = this.patternWidth();
		this._Drill_EFIE.real_height = this.patternHeight();
	}
}

//=============================================================================
// * 數學 - 鎖定錨點
//			
//			說明：修正 旋轉+縮放 的xy座標，使其看起來像是在繞著 新的錨點 變換。
//=============================================================================
Game_Temp.prototype.drill_EFIE_getFixPointInAnchor = function( 
					org_anchor_x,org_anchor_y,			//原貼圖中心錨點 
					target_anchor_x,target_anchor_y, 	//新的中心錨點 
					width, height,						//貼圖高寬
					rotation, scale_x, scale_y ) {		//變換的值（旋轉+縮放）
	
	var ww = width * ( target_anchor_x - org_anchor_x );
	var hh = height * ( target_anchor_y - org_anchor_y );
	var xx = 0;
	var yy = 0;
	if( ww == 0 && hh == 0){ return { "x":0, "y":0 }; }
	if( ww == 0 ){ ww = 0.0001; }
	
	var r = Math.sqrt( Math.pow(ww,2) + Math.pow(hh,2) );
	var p_degree = Math.atan(hh/ww);	
	p_degree = Math.PI - p_degree;
	
	xx = r*Math.cos( rotation - p_degree);		//圓公式 (x-a)²+(y-b)²=r²
	yy = r*Math.sin( rotation - p_degree);		//圓極座標 x=ρcosθ,y=ρsinθ
	xx += ww * (1 - scale_x);
	yy += hh * (1 - scale_y);
	
	return { "x":xx, "y":yy };
}


//=============================================================================
// ** 物體
//=============================================================================
//==============================
// * 物體 - 初始化
//==============================
var _Drill_EFIE_c_initialize = Game_Character.prototype.initialize;
Game_Character.prototype.initialize = function() {
	_Drill_EFIE_c_initialize.call(this);
	this._Drill_EFIE = {};					//（不要用initMembers，follower沒有這個方法）
	this._Drill_EFIE.x = 0;					// x
	this._Drill_EFIE.y = 0;					// y
	this._Drill_EFIE.rotation = 0;			// 旋轉
	this._Drill_EFIE.scale_x = 0;			// 縮放x
	this._Drill_EFIE.scale_y = 0;			// 縮放y
	this._Drill_EFIE.skew_x = 0;			// 斜切x
	this._Drill_EFIE.skew_y = 0;			// 斜切y
	
	this._Drill_EFIE.opacity = 0;			// 透明度（不疊加）
	this._Drill_EFIE.playing_type = "";		// 顯示類型
	this._Drill_EFIE.real_width = -1;		// 貼圖寬
	this._Drill_EFIE.real_height = -1;		// 貼圖高
}
//==============================
// * 物體 - 動作判定
//==============================
Game_Character.prototype.drill_EFIE_isPlaying = function() {
	if( !this._Drill_EFIE ){ return false; }
	if( this._Drill_EFIE.playing_type == "" ){ return false; }
	return true;
}
//==============================
// * 物體 - 幀刷新
//==============================
var _Drill_EFIE_c_update = Game_CharacterBase.prototype.update;
Game_CharacterBase.prototype.update = function() {
	_Drill_EFIE_c_update.call(this);
	
	if( this._Drill_EFIE == undefined ){ return; } 
	if( this._Drill_EFIE.playing_type == "" ){ return; }
	if( this._Drill_EFIE.real_width == -1 ){ return; }		//需要等圖片加載完成
	if( this._Drill_EFIE.real_height == -1 ){ return; }
	
	this.drill_EFIE_updateShowingFall();
	this.drill_EFIE_updateShowingJump();
	this.drill_EFIE_updateShowingEnlarge();
	this.drill_EFIE_updateShowingHorizonFlat();
	this.drill_EFIE_updateShowingVerticalFlat();
}
//==============================
// * 初始化 - 終止效果
//==============================
Game_Character.prototype.drill_EFIE_stopEffect = function() {
	var ef = this._Drill_EFIE;
	ef.x = 0;					// x
	ef.y = 0;					// y
	ef.rotation = 0;			// 旋轉
	ef.scale_x = 0;				// 縮放x
	ef.scale_y = 0;				// 縮放y
	ef.skew_x = 0;				// 斜切x
	ef.skew_y = 0;				// 斜切y
	ef.opacity = 255 ;
	ef.playing_type = "";
	this.setOpacity(ef.opacity);
}


//==============================
// * 初始化 - 顯現 標準落下
//==============================
Game_Character.prototype.drill_EFIE_playShowingFall = function( time,height,b_time ) {
	var ef = this._Drill_EFIE;
	ef.playing_type = "showingFalling";
	ef.fA_tdest = time;
	ef.fA_distance = -1 * height;
	ef.fA_a = 2*ef.fA_distance/ef.fA_tdest/ef.fA_tdest;	//加速度公式
	ef.fA_time = 0;
	ef.fB_tdest = b_time || 20;		//固定拋物線公式
	if (b_time == 0)
	  ef.fB_tdest = 0;
	ef.fB_time = 0;
}
//==============================
// * 幀刷新 - 顯現 標準落下
//==============================
Game_Character.prototype.drill_EFIE_updateShowingFall = function() {
	var ef = this._Drill_EFIE;
	if( ef.playing_type != "showingFalling" ){ return; }
	
	if( ef.fA_time < ef.fA_tdest ){
		ef.fA_time ++;
		var t = ef.fA_time;
		ef.y = ef.fA_distance - ef.fA_a*t*t/2;	//加速下落
		if(ef.y >0){ 
			ef.y = 0;
			//alert(ef.fA_time);	//驗證加速度時間
		}
		ef.opacity = 255 * ef.fA_time /ef.fA_tdest * 3 ;
		this.setOpacity(ef.opacity);

	// 老饕：去除緩衝時間
	}else if( ef.fB_time <= ef.fB_tdest ){
		if (ef.fB_tdest>0){
			ef.fB_time ++;
			var t = ef.fB_time;
			var a = 0.8 / ef.fB_tdest / ef.fB_tdest;	//固定壓縮0.2比例
			var b = -1 * a * ef.fB_tdest;
			var c = 0;
			//ef.scale_x = 0.01777777 * t - 0.00039506 *t*t;	//45幀拋物線公式
			//ef.scale_x = 0.02666666 * t - 0.00088888 *t*t;	//30幀
			//ef.scale_x = 0.04 * t - 0.002 *t*t;				//20幀
			ef.scale_x = -1*(a*ef.fB_time*ef.fB_time + b*ef.fB_time + c);
			ef.scale_y = -ef.scale_x;
			ef.opacity = 255;
			this.setOpacity(ef.opacity);
		}else{
			ef.fB_time ++;
			ef.opacity = 255;
			this.setOpacity(ef.opacity);
		}
		
	}else{
		this.drill_EFIE_stopEffect();	//結束動作
	}
}


//==============================
// * 初始化 - 顯現 標準彈跳
//==============================
Game_Character.prototype.drill_EFIE_playShowingJump = function( time, height ) {
	var ef = this._Drill_EFIE;
	ef.playing_type = "showingJump";
	ef.f_a = -4*height/time/time;	//拋物線公式 y = ax2 + bx +c
	ef.f_b = 4*height/time;	
	ef.f_c = 0;	
	ef.f_time = 0;
	ef.f_tdest = time;
}
//==============================
// * 幀刷新 - 顯現 標準彈跳
//==============================
Game_Character.prototype.drill_EFIE_updateShowingJump = function() {
	var ef = this._Drill_EFIE;
	if( ef.playing_type != "showingJump" ){ return; }
		
	if( ef.f_time <= ef.f_tdest/2 ){		//通用一個公式，只是根據頂點值分成了兩份
		ef.f_time ++;
		var t = ef.f_time;
		ef.y = -1*(ef.f_a*t*t + ef.f_b*t);
		ef.opacity = 255 * ef.f_time /ef.f_tdest*2 ;
		this.setOpacity(ef.opacity);
	}else if( ef.f_time < ef.f_tdest ){
		ef.f_time ++;
		var t = ef.f_time;
		ef.y = -1*(ef.f_a*t*t + ef.f_b*t);
		if(ef.y >0){ ef.y = 0; }
		ef.opacity = 255 ;
		this.setOpacity(ef.opacity);
	}else{
		this.drill_EFIE_stopEffect();	//結束動作
	}
}


//==============================
// * 初始化 - 顯現 放大出現
//==============================
Game_Character.prototype.drill_EFIE_playShowingEnlarge = function( time,b_time ) {
	var ef = this._Drill_EFIE;
	ef.playing_type = "showingEnlarge";
	
	ef.fA_sa = 2/time/time/2;	//勻加速公式 scale = 1/2 * at2
	ef.fA_sb = 0;	
	ef.fA_sc = 0;	
	ef.fA_ya = 20/time/time/2;	//拋物線公式 y = ax2 + bx +c
	ef.fA_yb = 0;	
	ef.fA_yc = 0;	
	ef.fA_time = 0;
	ef.fA_tdest = time;
	
	ef.fB_tdest = b_time || 20;
	ef.fB_time = 0;
}
//==============================
// * 幀刷新 - 顯現 放大出現
//==============================
Game_Character.prototype.drill_EFIE_updateShowingEnlarge = function() {
	var ef = this._Drill_EFIE;
	if( ef.playing_type != "showingEnlarge" ){ return; }
		
	if( ef.fA_time < ef.fA_tdest ){
		ef.fA_time ++;
		var t = ef.fA_time;
		
		ef.y = 20 -1*(ef.fA_ya*t*t + ef.fA_yb*t);	//拋物線
		ef.scale_x = -1 + ef.fA_sa*t*t + ef.fA_sb*t;	//勻加速放大
		ef.scale_y = ef.scale_x;

		if(ef.y >0){ 
			ef.y = 0;
			//alert(ef.fA_time);	//驗證加速度時間
		}
		ef.opacity = 255 * ef.fA_time /ef.fA_tdest ;
		this.setOpacity(ef.opacity);
	}else if( ef.fB_time < ef.fB_tdest ){
		ef.fB_time ++;
		var t = ef.fB_time;
		var a = 0.8 / ef.fB_tdest / ef.fB_tdest;	//固定壓縮0.2比例
		var b = -1 * a * ef.fB_tdest;
		var c = 0;
		ef.scale_x = -1*(a*ef.fB_time*ef.fB_time + b*ef.fB_time + c);
		ef.scale_y = ef.scale_x;
		ef.opacity = 255;
		this.setOpacity(ef.opacity);
		
	}else{
		this.drill_EFIE_stopEffect();	//結束動作
	}
}


//==============================
// * 初始化 - 顯現 橫向冒出
//==============================
Game_Character.prototype.drill_EFIE_playShowingHorizonFlat = function( time, scale_x ) {
	var ef = this._Drill_EFIE;
	ef.playing_type = "showingHorizonFlat";
	
	ef.f_tdest = time ;
	ef.f_time = 0;
	ef.f_scale_x = scale_x - 1.0;
}
//==============================
// * 幀刷新 - 顯現 橫向冒出
//==============================
Game_Character.prototype.drill_EFIE_updateShowingHorizonFlat = function() {
	var ef = this._Drill_EFIE;
	if( ef.playing_type != "showingHorizonFlat" ){ return; }
		
	if( ef.f_time < ef.f_tdest ){
		ef.f_time ++;
		
		ef.scale_x = ef.f_scale_x * (ef.f_tdest - ef.f_time)/ef.f_tdest ;
		ef.scale_y = -1.0 * (ef.f_tdest - ef.f_time)/ef.f_tdest ;
		
		ef.opacity = 255 * ef.f_time /ef.f_tdest ;
		this.setOpacity(ef.opacity);
	}else{
		this.drill_EFIE_stopEffect();	//結束動作
	}
}


//==============================
// * 初始化 - 顯現 縱向冒出
//==============================
Game_Character.prototype.drill_EFIE_playShowingVerticalFlat = function( time, scale_y ) {
	var ef = this._Drill_EFIE;
	ef.playing_type = "showingVerticalFlat";
	
	ef.f_tdest = time ;
	ef.f_time = 0;
	ef.f_scale_y = scale_y - 1.0;
}
//==============================
// * 幀刷新 - 顯現 縱向冒出
//==============================
Game_Character.prototype.drill_EFIE_updateShowingVerticalFlat = function() {
	var ef = this._Drill_EFIE;
	if( ef.playing_type != "showingVerticalFlat" ){ return; }
		
	if( ef.f_time < ef.f_tdest ){
		ef.f_time ++;
		
		ef.scale_x = -1.0 * (ef.f_tdest - ef.f_time)/ef.f_tdest ;
		ef.scale_y = ef.f_scale_y * (ef.f_tdest - ef.f_time)/ef.f_tdest ;
		
		ef.opacity = 255 * ef.f_time /ef.f_tdest ;
		this.setOpacity(ef.opacity);
	}else{
		this.drill_EFIE_stopEffect();	//結束動作
	}
}


